Script pour CO Fantasy sous Roll20 5267
Forums > Jeux de rôle > JdR Black Book > Chroniques Oubliées
Pour le rang 3 d'Arwendée, au final j'ai trouvé un moyen pas vraiment contraignant.
D'abord un !cof-lancer-sort pour le lancement et le cout en mana, couplé avec un !cof-effet-temp messageRetarde(carquois) pour garder trace de la durée du buff ( de plus, vu qu'on ne peut appliquer de Tempete de mana sur un !cof-lancer-sort, j'a rajouté un menu déroulant pour ses options Rapide et/ou Durée ).
Et 3 lignes d'attaques, une pour chaque élément :
Au moment du lancement du sort, la joueuse n'aura qu'à dégainer l'option choisi. Toutes ses options d'attaque dépendant de son arme en main, tout fonctionne comme voulu.
Affaire réglée.
Après, si tu te sens d'implémenter qqch qd tu auras le temps, je prends aussi hein mais franchement, je pense que ca va le faire comme ça.
Par contre, les rangs suivants...
L'autre soir (lundi dernier), sans changement particulier sur la partie ou le script (mais sans Mise à jour non plus je confesse, on est en 3.04), on a eu des shutdown à répétition avec le message suivant :
Your scripts are currently disabled due to an error that was detected. Please make appropriate changes to your script's code and click the "Save Script" button. We will then attempt to start running the scripts again. More info... If this script was installed from the Script Library, you might find help in the Community API Forum.
For reference, the error message generated was: There was an error communicating with the QuantumRoll server.
undefined
De ce que j'en comprends, c'était un souci dans les serveurs de roll20 mais je voulais être certaine que j'ai pas encore fait une bétise. D'autre ont eu des soucis ?
Je faisais un restart, puis on lançait un dé, il fallait restart etc... On a fini à l'ancienne sans script c'était plus simple. ^^'
- Dwim
Il y a eu plein de problèmes roll20 ces derniers temps, j'ai bien galéré jeudi aussi. Malheureusement, c'est l'infra même de roll20 qui est à la ramasse, rien de véritablement lié à ta partie / au script.
- TricheLumiere
Je plussoie, j'ai été obligé de corriger un problème sur la fiche COC parce que les changements non documentés de l'infrastructure Roll20 ont révélés un bug dans le script de la fiche qui "passait" jusque là.
De plus, la plate-forme est devenue quasiment inutilisable avec Google Chrome (et pourtant j'ai 16 Go de RAM sur mon PC), surtout avec les campagnes du marketplace incluant l'éclairage dynamique. J'ai donc basculé sur Firefox.
Bonjour Ulti,
3 questions...
1- Est-il possible de forcer un malus global sur un personnage. Genre -3 à tout (attaque, défense, jets, etc.). Aussi bien pour simuler un handicape particulier (de l'eau jusqu'au torse), qu'une fatigue extrême. Donc un équivalent à !cof-affaiblir-carac mais pour tous les jets de dés.
2- Peut on implémenter une attaque à distance (arc) qui touche trois cibles ? Donc un seul jet d'attaque contre trois cibles à sélectionner ? J'ai tenté un --target @{target|Cible 2|Cible 3|token_id}, sans succès. C'est pour l'arc d'Arly.
3- Peut on adapter le Siphon de Âmes pour qu'il ne prenne pas celle des alliés ? S'il siphonne l'ame des alliés qui tombe inconscient, pour moi on ne pas pas les réanimer... Pour le moment, je le fais à la main, ie je lui remet les dégats correspondants. Aucune urgence
Merci d'avance pour ton aide.
1- Est-il possible de forcer un malus global sur un personnage. Genre -3 à tout (attaque, défense, jets, etc.). Aussi bien pour simuler un handicape particulier (de l'eau jusqu'au torse), qu'une fatigue extrême. Donc un équivalent à !cof-affaiblir-carac mais pour tous les jets de dés.
Pour l'instant, rien de ce genre, mais tu peux utiliser la barre 3 des tokens pour forcer un malus aux jets (c'est mis dans la doc). Et !cof-buf-def pour un bonus / malus temporaire de def (cf. doc).
2- Peut on implémenter une attaque à distance (arc) qui touche trois cibles ? Donc un seul jet d'attaque contre trois cibles à sélectionner ? J'ai tenté un --target @{target|Cible 2|Cible 3|token_id}, sans succès. C'est pour l'arc d'Arly.
--target @{target|Cible 2|token_id} --target @{target|Cible 3|token_id}
3- Peut on adapter le Siphon de Âmes pour qu'il ne prenne pas celle des alliés ? S'il siphonne l'ame des alliés qui tombe inconscient, pour moi on ne pas pas les réanimer... Pour le moment, je le fais à la main, ie je lui remet les dégats correspondants. Aucune urgence
Il vaut mieux faire ça à la main car ça dépend des situations. J'ai ouï dire que certaines prêtresses Elfe Noir ne se privaient pas d'aspirer l'âme de leurs sbires (qui sont pourtant bien des alliés) ...
- Beeloshi
Merci Dwim.
1- Oui c'est ce que je fais pour le moment.
2- Ha oui ok. J'aurais pas trouvé tout seul Merci.
3- Ca me va. On reste à la mano.
Question subsidiaire :
Est-ce qu'il est possible de masquer les RD aux joueurs ?
Donc qu'ils ne voient que les dégats de leurs dés, mais pas les dégats réellement appliqués?
Donc qu'ils ne soient pas conscient que le mortvivant truc à un RD de 5 sur les contandant et que le général truc divise les dégats par 2 parce qu'il a des sous fifres pas loin ?
- Dwim
Ca me paraît bizarre de vouloir cacher ça. Dans un cas comme dans l'autre, ça s'explique par un truc que le personnage devrait être capable de constater, ce n'est pas de l'information cachée.
Dans le premier, son épée passe entre les côtes de son adversaire, ou ricoche sur ses os. Il suffit de le décrire comme cela, la raison précise n'est pas expliquée (il n'est pas marqué "grâce à sa résistance aux dégâts tranchants, -5 aux dégâts ...", mais il est marqué "-5", au MJ de broder sur la raison sans avoir à tout justifier).
Pour les dégâts divisés par deux c'est la même chose, et c'est aussi basé sur quelque chose que le MJ devrait expliquer : le général, entouré de ses alliés, est plus difficile à blesser.
En tout cas dans le script il n'y a rien d'implémenté pour cela.
- Beeloshi
L'idée n'est pas de caché mais de ne pas montrer clairement la résistance.
Sinon les joueurs partent dans des comptes d'apothicaire pour faire passer les dégats et ca fait sortir de l'immersion quand on commence à calculer en détail.
Je brode effectivement autour des RD. "Ca passe à travers", "Cela semble moins efficace que tu le penserais", "Un sous fifre dévit en partie ta lame", etc.
Mais c'est le fait d'avoir le -5 en gros ou le /2, qui me "dérange".
Ca n'handicape en rien la partie ou le jeu, mais je me posais la question de savoir si on pouvait masquer cela, n'avoir que le résultat des dés pour le joueur, et que les dégats soient appliqués avec la réduction à la discrétion du MJ.
C'est encore une fois pour pinailler et me rapprocher au plus prêt de ce que je fais quand on joue en live
J'en profite pour dire que temporairement, le temps qu'Ulti revienne de ses vacances bien méritées, vous pouvez trouver sur mon Github https://github.com/Far2Casual/COFantasy une version avec :
- la correction de la doc
- la correction du message pour Nuées d'Insectes (merci Platy)
- une implémentation du rang 4 de la Voie du Héros (pour Spite)
J'ai des push request en cours chez Ulti qui les prendra (ou pas ) quand il revient.
Bonnes fêtes !
- Spite
- et
- Platy
Pourtant la branche master de mon repo est bien mise à jour :
https://raw.githack.com/Far2Casual/COFantasy/master/doc.html#Prestige
J'en profite pour dire que temporairement, le temps qu'Ulti revienne de ses vacances bien méritées, vous pouvez trouver sur mon Github https://github.com/Far2Casual/COFantasy une version avec :
- la correction de la doc
- la correction du message pour Nuées d'Insectes (merci Platy)
- une implémentation du rang 4 de la Voie du Héros (pour Spite)
J'ai des push request en cours chez Ulti qui les prendra (ou pas ) quand il revient.
Bonnes fêtes !
Dwim
C'est poussé. Merci Dwim!
Hello à tous,
Bon déjà pour commencer : Bonne fête à tous !
J'envoie ce "petit" pavé parce que j'ai un joueur qui a pris la voie du prestige du Maître des cadavres. J'ai bidouillé des petits trucs pour les deux premiers rangs (ceux dont j'avais besoin), rien de bien méchant, j'ai en grande partie fait un copié-collé du script avec modification :
1. Explosion de cadavre : le personnage cible le cadavre d’une créature à une portée de 30 mètres en utilisant une action de mouvement. Celui-ci explose en infligeant des DM proportionnels à sa taille: petite 1d6 sur 5 mètres de diamètre, moyenne 2d6 sur 10 mètres, grande 3d6 sur 15m, énorme 4d6 sur 20m, colossal 5d6 sur 25m de diamètre. Une victime peut faire un test de DEX difficulté [10 + Mod. d’INT] pour diviser les DM par 2.
De plus le nécromancien peut animer un zombi supplémentaire par rang atteint dans la Voie (voir animation des morts, page 52).
Pour la première partie j'ai juste créée une attaque comme suit (c'est pas très propre et je regarderai plus tard pour faire un truc dans le script, mais bon en attendant...) :
#Attaque Explosion de cadavre --auto ?{Type monstre|Petit, --dm 1d6 --disque 5|Moyen, --dm 2d6 --disque 10|Grand, --dm 3d6 --disque 15|Énorme, --dm 4d6 --disque 20|Colossale, --dm 5d6 --disque 25} --portee 30 --necromancie --magique --sortilege --psave DEX [[10+@{selected|INT}]] --targetFx explode-death
Pour la deuxième partie j'ai fais les modifs suivantes :
l. 32189 : let rangVoie = predicateAsInt(necromant, 'voieOutreTombe', 1) + predicateAsInt(necromant, 'voieMaitreCadavres', 0);l. 41879 : '|resistanceALaMagieBarbare|riposteGuerrier|tirFatal|traquenard|voieOutreTombe|voieMaitreCadavres' +
Pour éviter d'avoir à faire des modfications dans le script, augmenter le predicat 'voieOutreTombe' au-delà de 5 suffit.
2. Animation de squelette (L)* : le personnage peut animer le squelette d’une créature humanoïde et le contrôler. Le squelette obéit à des ordres simples : attaquer, garder, attendre, suivre. Le personnage peut contrôler jusqu’à deux squelettes par rang atteint dans la voie, ses caractéristiques sont indiquées dans le bestiaire page 272.
Voilà ce que j'ai ajouté l. 32263 :
var squeletteAnime = { nom: 'Squelette', avatar: "https://s3.amazonaws.com/files.d20.io/images/261978483/c9i26OGPQLVRqtUpM63TpA/thumb.png?1640684182", token: "https://s3.amazonaws.com/files.d20.io/images/261978483/c9i26OGPQLVRqtUpM63TpA/thumb.png?1640684182", attributesFiche: { type_personnage: 'PNJ', niveau: 1, force: 12, pnj_for: 1, dexterite: 8, pnj_dex: -1, constitution: 12, pnj_con: 1, intelligence: 2, pnj_int: -4, sagesse: 6, pnj_sag: -2, charisme: 2, pnj_cha: -4, pnj_def: 14, pnj_init: 12, race: 'squelette', taille: 'moyen' }, attaques: [{ nom: 'Attaqu', atk: 2, dmnbde: 1, dmde: 6, dm: 1 }], pv: 9, attributes: [{ name: 'predicats_script', current: 'sansEsprit' }, { name: 'predicats_script', current: 'nonVivant' }, { name: 'contondant', current: 5 }], abilities: [] }; function animerSquelette(msg) { let options = parseOptions(msg); if (options === undefined) return; let cmd = options.cmd; if (cmd === undefined || cmd.length < 2) { error("!cof-animer-squelette mal formé, il faut un token comme premier argument", msg.content); return; } const necromant = persoOfId(cmd[1], cmd[1], options.pageId); if (necromant === undefined) { error("Le premier argument de !cof-animer-squelette n'est pas un token valide", cmd); return; } let squelettesControles = attributeAsInt(necromant, 'squelettesControles', 0); let rangVoie = 2 * predicateAsInt(necromant, 'voieMaitreCadavres', 1); if (squelettesControles >= rangVoie) { sendPerso(necromant, "ne peut plus animer de Zombie car il en contrôle déjà assez."); return; } options.lanceur = necromant; const evt = { type: 'animerSquelette', action: { rolls: {} }, characters: [], tokens: [] }; addEvent(evt); if (limiteRessources(necromant, options, 'animerSquelette', "lancer un sort d'Animation des squelettes", evt)) return; if (!stateCOF.combat) { initPerso(necromant, evt); } let nomToken = "Squelette de " + necromant.token.get('name'); let token = createObj('graphic', { name: nomToken, showname: 'true', subtype: 'token', pageid: options.pageId, imgsrc: squeletteAnime.token, left: necromant.token.get('left'), top: necromant.token.get('top'), width: 70, height: 70, layer: 'objects', showplayers_bar1: 'true', light_hassight: 'true', light_angle: 120, has_bright_light_vision: true, has_limit_field_of_vision: true, }); toFront(token); let squelette = { ...squeletteAnime }; let playerId = getPlayerIdFromMsg(msg); let charSquelette = createCharacter(nomToken, playerId, squeletteAnime.avatar, token, squelette); evt.characters.push(charSquelette); evt.tokens.push(token); // Gestion de la limitation des squelettes createObj('attribute', { name: 'necromant', _characterid: charSquelette.id, current: necromant.token.id, }); initiative([{ _id: token.id }], evt); // Ajout du Squelette aux alliés du Nécromant let alliesNecromant = alliesParPerso[necromant.charId] || new Set(); alliesNecromant.add(charSquelette.id); alliesParPerso[necromant.charId] = alliesNecromant; sendPerso(necromant, "anime un Squelette", options.secret); if (options.messages) { options.messages.forEach(function(m) { sendPerso(necromant, m, options.secret); }); } setTokenAttr(necromant, "squelettesControles", squelettesControles + 1, evt); }
Sans oublier :
l.37389 case '!cof-animer-squelette': animerSquelette(msg);return;
Bon voilà c'est à disposition si certains en ont besoin. Il y a peut être des modifs à faire.
Encore bonne fête à tous.
- Dwim
Bonjour à tous,
Je vous écris car j'ai un souci avec le pacte sanglant.
Mon joueur est au niveau 5 dans la voie du Démon (Nécromacien), il est censé pouvoir choisir soit d'ajouter +3 sur un jet d20 en sacrifiant 1d4PV, soit +5 sur un jet d20 en sacrifiant 2d4PV. Or que l'on clique sur le bouton +3 ou sur le bouton +5, le jet de dé pour sacrifier des PV est toujours de 2d4.
De ce que j'ai cru comprendre, en regardant le script, à partir du moment où le prédicat pacteSanglant est à 5, c'est forcément 2d4PV de sacrifié.
Ai-je mal interprété les règles ? Oe est-ce qu'il y a un petit souci dans le script ?
Merci pour vos retours.
- Dwim